/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucuenca.ec.nosql.controller;

import edu.ucuenca.ec.nosql.conexion.DriverMongoDB;
import edu.ucuenca.ec.nosql.modelos.Carrito;
import edu.ucuenca.ec.nosql.modelos.Producto;
import edu.ucuenca.ec.nosql.security.CarritoSession;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 *
 * @author mivkys
 */
@ManagedBean(name = "carritoController")
@SessionScoped
public class CarritoController implements Serializable {

    private Producto selected;
    private Carrito carrito;
    private List<Producto> recomenProductos;
    private List<Producto> addProductos;
    private List<String> groupThemes;
    ////varaibles no tan necesarias;
    private int cantidad;
    private String filtrador;

    public CarritoController() {

    }

    @PostConstruct
    public void init() {
        System.out.println("posconstruc carritocontroller");
        recomenProductos = new ArrayList<>();
        addProductos = new ArrayList<>();
        carrito = new Carrito();
        if (CarritoSession.getUsuario() != null) {
            addProductos = CarritoSession.getAddProductos();
            recomenProductos = CarritoSession.getRecomenProductos();
        }
        cargarGroups();
        CarritoSession.setAddProductos(addProductos);
    }

    public void flush() {
        System.out.println("si flush");
        if (CarritoSession.getUsuario() != null) {
            if (CarritoSession.getAddProductos() != null) {
                addProductos = CarritoSession.getAddProductos();
            }
            if (CarritoSession.getRecomenProductos() != null) {
                recomenProductos = CarritoSession.getRecomenProductos();
            }
        } else {
            recomenProductos = new ArrayList<>();
            addProductos = new ArrayList<>();
            carrito = new Carrito();
            CarritoSession.setRecomenProductos(recomenProductos);
            CarritoSession.setAddProductos(addProductos);
        }
    }

    public void actualizar() {
        if (CarritoSession.getUsuario() != null && CarritoSession.getAllProductos() != null) {///////////no necesario la ultima condicion

            DriverMongoDB.setDB_Mongo("online");
            carrito = DriverMongoDB.findCarrito("carrito", CarritoSession.getUsuario().getId());////busca el carrito del usuario;
//            for (Producto producto : CarritoSession.getAllProductos()) {
//                if (producto.productoRecomendado(CarritoSession.getUsuario().getId())) {
//                    recomenProductos.add(producto);
//                }
//            }
            if (carrito != null && carrito.getIdsProductos() != null) {
                for (int idproducto : carrito.getIdsProductos()) {
                    Producto producto = DriverMongoDB.findIdProducto("producto", idproducto);
                    if (producto != null) {
                        addProductos.add(producto);
                    }

                }
            }
        }
        CarritoSession.setAddProductos(addProductos);
        CarritoSession.setRecomenProductos(recomenProductos);
    }

    private void cargarGroups() {
        Set<String> sets = new HashSet<>();
        for (Producto allProducto : recomenProductos) {
            sets.add(allProducto.getGroup());
        }
        groupThemes = new ArrayList<>(sets);
    }

    public void agregar(Producto add) {
        System.out.println("si llega " + add.getTitle());
        if (add != null && CarritoSession.getUsuario() != null) {
            if (!addProductos.contains(add)) {
                addProductos.add(add);
                CarritoSession.setAddProductos(addProductos);
                carrito.insertProducto(addProductos);
                carrito.setId(CarritoSession.getUsuario().getId());
                DriverMongoDB.setDB_Mongo("online");
                DriverMongoDB.insertCarrito(carrito, "carrito");
            }
        }
    }

    public void quitar(Producto add) {
        System.out.println("si llega " + add.getTitle());
        if (add != null && CarritoSession.getUsuario() != null) {
            addProductos.remove(add);
            CarritoSession.setAddProductos(addProductos);
            carrito.insertProducto(addProductos);
            carrito.setId(CarritoSession.getUsuario().getId());
            DriverMongoDB.setDB_Mongo("online");
            DriverMongoDB.insertCarrito(carrito, "carrito");
        }
    }

    /**
     * @return the selected
     */
    public Producto getSelected() {
        return selected;
    }

    /**
     * @param selected the selected to set
     */
    public void setSelected(Producto selected) {
        this.selected = selected;
    }

    /**
     * @return the recomenProductos
     */
    public List<Producto> getRecomenProductos() {
        return recomenProductos;
    }

    /**
     * @param recomenProductos the recomenProductos to set
     */
    public void setRecomenProductos(List<Producto> recomenProductos) {
        this.recomenProductos = recomenProductos;
    }

    /**
     * @return the carrito
     */
    public Carrito getCarrito() {
        return carrito;
    }

    /**
     * @param carrito the carrito to set
     */
    public void setCarrito(Carrito carrito) {
        this.carrito = carrito;
    }

    /**
     * @return the addProductos
     */
    public List<Producto> getAddProductos() {
        return addProductos;
    }

    /**
     * @param addProductos the addProductos to set
     */
    public void setAddProductos(List<Producto> addProductos) {
        this.addProductos = addProductos;
    }

    /**
     * @return the cantidad
     */
    public int getCantidad() {
        return cantidad;
    }

    /**
     * @param cantidad the cantidad to set
     */
    public void setCantidad(int cantidad) {
        this.cantidad = cantidad;
    }

    /**
     * @return the filtrador
     */
    public String getFiltrador() {
        return filtrador;
    }

    /**
     * @param filtrador the filtrador to set
     */
    public void setFiltrador(String filtrador) {
        this.filtrador = filtrador;
    }

    /**
     * @return the groupThemes
     */
    public List<String> getGroupThemes() {
        return groupThemes;
    }

    /**
     * @param groupThemes the groupThemes to set
     */
    public void setGroupThemes(List<String> groupThemes) {
        this.groupThemes = groupThemes;
    }

}
